package javazoom.jlgui.basicplayer; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Control; import javax.sound.sampled.DataLine; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class BasicPlayerApplet extends BasicPlayer { private static Log log = LogFactory.getLog(BasicPlayerApplet.class); // Applet UGLY workaround. public static String OGGEXTENSIONS = "ogg"; public static String AUEXTENSIONS = "au"; public static String WAVEXTENSIONS = "wav"; public static boolean isOgg = false; public static boolean forceOgg = false; public BasicPlayerApplet() { super(); } /** * Inits Audio ressources from file. */ protected void initAudioInputStream(File file) throws UnsupportedAudioFileException, IOException { // Applet UGLY workaround. if ((file.getName().toLowerCase().endsWith(AUEXTENSIONS)) || (file.getName().toLowerCase().endsWith(WAVEXTENSIONS))) { m_audioInputStream = AudioSystem.getAudioInputStream(file); m_audioFileFormat = AudioSystem.getAudioFileFormat(file); isOgg = false; } else if ((file.getName().toLowerCase().endsWith(OGGEXTENSIONS)) || (forceOgg==true)) { m_audioInputStream = AppletVorbisSPIWorkaround.getAudioInputStream(file); m_audioFileFormat = AppletVorbisSPIWorkaround.getAudioFileFormat(file); isOgg = true; } else { m_audioInputStream = AppletMpegSPIWorkaround.getAudioInputStream(file); m_audioFileFormat = AppletMpegSPIWorkaround.getAudioFileFormat(file); isOgg = false; } } /** * Inits Audio ressources from URL. */ protected void initAudioInputStream(URL url) throws UnsupportedAudioFileException, IOException { // Applet UGLY workaround. if ((url.toString().toLowerCase().endsWith(AUEXTENSIONS)) || (url.toString().toLowerCase().endsWith(WAVEXTENSIONS))) { m_audioInputStream = AudioSystem.getAudioInputStream(url); m_audioFileFormat = AudioSystem.getAudioFileFormat(url); isOgg = false; } else if ((url.toString().toLowerCase().endsWith(OGGEXTENSIONS)) || (forceOgg==true)) { m_audioInputStream = AppletVorbisSPIWorkaround.getAudioInputStream(url); m_audioFileFormat = AppletVorbisSPIWorkaround.getAudioFileFormat(url); isOgg = true; } else { m_audioInputStream = AppletMpegSPIWorkaround.getAudioInputStream(url); m_audioFileFormat = AppletMpegSPIWorkaround.getAudioFileFormat(url); isOgg = false; } } /** * Inits Audio ressources from InputStream. */ protected void initAudioInputStream(InputStream inputStream) throws UnsupportedAudioFileException, IOException { // Applet UGLY workaround. if (forceOgg==true) { m_audioFileFormat = AppletVorbisSPIWorkaround.getAudioFileFormat(inputStream); m_audioInputStream = AppletVorbisSPIWorkaround.getAudioInputStream(inputStream); isOgg = true; } else { // Try MP3 format. try { m_audioFileFormat = AppletMpegSPIWorkaround.getAudioFileFormat(inputStream); m_audioInputStream = AppletMpegSPIWorkaround.getAudioInputStream(inputStream); isOgg = false; } catch (IOException ex) { throw ex; } catch (UnsupportedAudioFileException ex) { // Try Vorbis format. m_audioFileFormat = AppletVorbisSPIWorkaround.getAudioFileFormat(inputStream); m_audioInputStream = AppletVorbisSPIWorkaround.getAudioInputStream(inputStream); isOgg = true; } } } protected void createLine() throws LineUnavailableException { log.info("Create Line"); if (m_line == null) { AudioFormat sourceFormat = m_audioInputStream.getFormat(); log.info("Create Line : Source format : " + sourceFormat.toString()); AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels() * 2, sourceFormat.getSampleRate(), false); log.info("Create Line : Target format: " + targetFormat); // Keep a reference on encoded stream to progress notification. m_encodedaudioInputStream = m_audioInputStream; try { // Get total length in bytes of the encoded stream. encodedLength = m_encodedaudioInputStream.available(); } catch (IOException e) { log.error("Cannot get m_encodedaudioInputStream.available()",e); } // Create decoded stream. // Applet UGLY workaround. if ((isOgg == true) || (forceOgg == true)) m_audioInputStream = AppletVorbisSPIWorkaround.getAudioInputStream(targetFormat,m_audioInputStream); else m_audioInputStream = AppletMpegSPIWorkaround.getAudioInputStream(targetFormat,m_audioInputStream); AudioFormat audioFormat = m_audioInputStream.getFormat(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat, AudioSystem.NOT_SPECIFIED); m_line = (SourceDataLine) AudioSystem.getLine(info); log.debug("Line AudioFormat: " + m_line.getFormat().toString()); /*-- Display supported controls --*/ Control[] c = m_line.getControls(); for (int p = 0; p < c.length; p++) { log.debug("Controls : " + c[p].toString()); } /*-- Is Gain Control supported ? --*/ if (m_line.isControlSupported(FloatControl.Type.MASTER_GAIN)) { m_gainControl = (FloatControl) m_line.getControl(FloatControl.Type.MASTER_GAIN); log.info("Master Gain Control : [" + m_gainControl.getMinimum() + "," + m_gainControl.getMaximum() + "] " + m_gainControl.getPrecision()); } /*-- Is Pan control supported ? --*/ if (m_line.isControlSupported(FloatControl.Type.PAN)) { m_panControl = (FloatControl) m_line.getControl(FloatControl.Type.PAN); log.info("Pan Control : [" + m_panControl.getMinimum() + "," + m_panControl.getMaximum() + "] " + m_panControl.getPrecision()); } } } }